package com.ruoyi.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.Project;
import com.ruoyi.system.dto.ProjectDTO;
import com.ruoyi.system.dto.ProjectQueryDTO;
import com.ruoyi.system.dto.ProjectDynamicDTO;
import com.ruoyi.system.dto.ProjectStagePointDTO;
import com.ruoyi.system.dto.ProgressCountDTO;

/**
 * 项目服务接口
 */
public interface ProjectService extends IService<Project> {

    /**
     * 创建项目
     * @param projectDTO 项目DTO
     * @return 创建的项目
     */
    ProjectDTO createProject(ProjectDTO projectDTO);

    /**
     * 更新项目
     * @param id 项目ID
     * @param projectDTO 项目DTO
     * @return 更新后的项目
     */
    ProjectDTO updateProject(Long id, ProjectDTO projectDTO);

    /**
     * 删除项目
     * @param id 项目ID
     * @return 是否删除成功
     */
    boolean deleteProject(Long id);

    /**
     * 根据ID查询项目
     * @param id 项目ID
     * @return 项目DTO
     */
    ProjectDTO getProjectById(Long id);

    ProjectDTO getProjectByIdNoValidatePermission(Long id);

    /**
     * 分页查询项目列表
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<ProjectDTO> queryProjectPage(ProjectQueryDTO queryDTO);

    /**
     * 生成项目编号
     * @return 项目编号
     */
    String generateProjectNo();

    /**
     * 已签单未开工合同数
     * 口径：存在合同（未删除、审核通过），且项目未进入施工（progress != 6 且 未结单）
     * @return 数量
     */
    long countSignedButNotStarted();

    /**
     * 待签合同数
     * 口径：项目未结单，且不存在任何有效合同记录
     * @return 数量
     */
    long countPendingSign();

    /**
     * 已开工项目数（progress = 6 且 未删除）
     */
    long countStartedProjects();

    /**
     * 已完工项目数（progress = 7 或 progress = 8，且 未删除）
     */
    long countFinishedProjects();

    

    /**
     * 项目动态列表（含合同总额、变更总费用、收款金额）
     * 管理员：全量；设计师：仅本人项目
     */
    IPage<ProjectDynamicDTO> queryProjectDynamics(int pageNum, int pageSize, String keyword);

    /**
     * 个人当前项目阶段统计图数据（横轴项目，纵轴阶段）
     * 管理员：全量；设计师：仅本人项目
     */
    java.util.List<ProjectStagePointDTO> listCurrentProjectStages();

    /**
     * 统计全部项目在各进度下的数量（1..8）。
     * 返回用于柱状图展示的数据列表，含进度值、名称、数量。
     * 数据范围：管理员全量，非管理员仅本人（设计师）项目。
     */
    java.util.List<ProgressCountDTO> countProjectsByProgress();
}